/**
 * Numeros.java
 * 
 * @version 1.0
 *
 * 11/21/2011
 * 
 * AOI
 */

package com.jcj.jumper;

import java.util.List;
import javax.microedition.khronos.opengles.GL10;
import com.jcj.framework.Game;
import com.jcj.framework.Input.TouchEvent;
import com.jcj.framework.gl.Camera2D;
import com.jcj.framework.gl.SpriteBatcher;
import com.jcj.framework.gl.Texture;
import com.jcj.framework.gl.TextureRegion;
import com.jcj.framework.impl.GLScreen;
import com.jcj.framework.math.OverlapTester;
import com.jcj.framework.math.Rectangle;
import com.jcj.framework.math.Vector2;

/**
 * Esta clase declara todos los recursos, variables y arreglo a utilizar en el juego de los multiplos
 *  
 * @author AOI
 * 
 * @version 1.0
 *  
 */
public class Numeros extends GLScreen {
	Camera2D guiCam;
    SpriteBatcher batcher;
    Vector2 touchPoint;
	Texture ImgNumeros;
	TextureRegion [] lista;
	creaNumeros [] num;
	boolean empieza = true;
	Rectangle nextBounds;
	Rectangle [] bolas;
	int x [] = new int[10];
	TextureRegion [] numerobase;
	int numerob;
	int buenas;
	Texture fondo;
	TextureRegion back;
	int vidas;
	int puntuacion;
	boolean mododejuego;
	Rectangle regresa;
	int valorinicio;
	int valordado;
	
	/**
	 *  Este metodo inicializa los recursos declarados en la clase anterior y toma los numeros para
	 *  el juego de la textura
	 * @param game  un objeto tipo game que se importa de framework necesario para la creacion del juego
	 * @param vidas el metodo recibe las vidas del jugador, que empieza en 3
	 * @param puntuacion el metodo recibe la puntuacion que lleva el jugador, empieza en 0
	 * @param mododejuego es un boolean que indica si el jugador esta en minijuegos o en el tablero
	 */
	
	public Numeros(Game game, int vidas, int puntuacion, boolean mododejuego,int valorinicio,int valordado) {
	    super(game);
	    this.valorinicio=valorinicio;
	    this.valordado=valordado;
    	this.vidas = vidas;
    	this.puntuacion = puntuacion;
    	this.mododejuego = mododejuego;
	    guiCam = new Camera2D(glGraphics, 320, 480);
	    touchPoint = new Vector2();
	    batcher = new SpriteBatcher(glGraphics, 50);
	    nextBounds = new Rectangle(320 - 64, 0, 64, 64);
		ImgNumeros = new Texture(glGame, "meteoritos.png");
		fondo = new Texture(glGame, "moon.png");
		back = new TextureRegion(fondo, 0, 0, 295, 160);
		lista = new TextureRegion[10];
		num = new creaNumeros[10];
		bolas = new Rectangle[10];
		numerobase = new TextureRegion[10];
		buenas = 1;
		int conty = 15;
		int contybase = 22;
		numerob = (int) (Math.random() * 3) + 1;
		
		for (int i = 0; i < 10; i++) {
			numerobase[i] = new TextureRegion(ImgNumeros, 111, contybase, 32, 40);
			contybase += 49;
			lista[i] = new TextureRegion(ImgNumeros, 31, conty, 49, 49);				
			num[i] = new creaNumeros(i, lista[i], (int) (Math.random() * 100) + 320, 
									(int) (Math.random() * 400) + 100, 
									(int) (Math.random() * 10), (int) (Math.random() * 5));
			conty = conty + 59;	
			}	
	
	
	}
	
	/**
	 * Este metodo actualiza las vidas y la puntuacion de acuerdo a la interacción que haya tenido el jugador,
	 * tambien depende del modo de juego en el que este el jugador. Sirve para saber si acertaste dentro del juego,
	 * ademas, a los 5 aciertos, regresa al jugador al tablero en la casilla correspondiente.
	 */
	
	@Override
	public void update(float deltaTime) {
	
		  List<TouchEvent> touchEvents = game.getInput().getTouchEvents();
	      game.getInput().getKeyEvents();
	      int len = touchEvents.size();
	      
	      for (int i = 0; i < len; i++) {
	          TouchEvent event = touchEvents.get(i);
	          touchPoint.set(event.x, event.y);
	          guiCam.touchToWorld(touchPoint);
	
	          if (event.type == TouchEvent.TOUCH_UP) {
	              if (OverlapTester.pointInRectangle(nextBounds, touchPoint)) {
	                  Assets.playSound(Assets.clickSound);
	                  game.setScreen(new MainMenuScreen(game));
	                  return;
	              }
	              
	              if (vidas <= 0) {
		              if (OverlapTester.pointInRectangle(regresa, touchPoint)) {
		                  Assets.playSound(Assets.clickSound);
		                  
		                  if (mododejuego == false) {
		                  game.setScreen(new MainMenuScreen(game));
		                  } else {
		                 	 game.setScreen(new JuegoScreen(game,valorinicio-valordado));
		                  }
		              return;
		              }
	              }
	          }
	          
	          for (int prueba = 0; prueba < 10; prueba++) {
		          if (event.type == TouchEvent.TOUCH_UP) {
		              if (OverlapTester.pointInRectangle(bolas[prueba], touchPoint)) {
		                  Assets.playSound(Assets.clickSound);
		                  
		                  if (prueba % (numerob + 1) == 0) {
		                	  num[prueba].setValores();
		                	  puntuacion++;
		                	  buenas++;
		                	  if (puntuacion==5){
		                		  game.setScreen(new JuegoScreen(game, valorinicio));
		                	  }
		                  } else {
		                	  vidas--;
		                  }
		                  return;
		              }
		          }
	          }
	      }
	}
	
	/**
	 * Este metodo se corre conforme la clase esta activa
	 * utiliza el batcher y el GL para pintar texturas y rectangulos a utilizarse en el juego
	 */
	
	@Override
	public void present(float deltaTime) {

		GL10 gl = glGraphics.getGL();
		 
	    gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
	    guiCam.setViewportAndMatrices();
	
	    gl.glEnable(GL10.GL_TEXTURE_2D);
	    batcher.beginBatch(fondo);
	    batcher.drawSprite(160, 240, 320, 480, back);
	    batcher.endBatch();
	    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
	    batcher.beginBatch(Assets.items);
	    batcher.drawSprite(320 - 32, 32, -64, 64, Assets.arrow);
	    batcher.endBatch();
	 
	//<<<<<<< .mine
	//batcher.endBatch();
	//=======
	    gl.glEnable(GL10.GL_BLEND);
	    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
	//>>>>>>> .r9
	 	for (int i = 0; i < 10; i++) { 			
 			batcher.beginBatch(ImgNumeros);
 	        batcher.drawSprite(num[i].posx, num[i].posy, 50, 60, num[i].ImagenNumero);
 	        batcher.endBatch();		
 	        num[i].nuevaposx();
 	        
 	        if (num[i].getPosX() < -25) {
 	        	num[i].setValores();
 	        }
 	        
 	        if (num[i].getPosY() < -25) {
 	        	num[i].setValores();
 	        }
 	        
 	        bolas[i] = new Rectangle(num[i].getPosX() - 25, num[i].getPosY() - 30, 50, 60);
	 	}
	 	
 		batcher.beginBatch(ImgNumeros);
 		batcher.drawSprite(160,	50, 60, 50, numerobase[numerob]);
 		batcher.endBatch();
   
 		if (buenas % 7 == 0) {
 			numerob= (int) (Math.random() * 3) + 1;
 			buenas++;
 		}
 		
 		if (vidas == 0) {
	    	batcher.beginBatch(Assets.gover);
	    	batcher.drawSprite(160, 240, 320, 480, Assets.gameover);
	    	batcher.endBatch();
	    	regresa = new Rectangle(0, 0, 320, 480);
	 	}
 		
 		batcher.beginBatch(Assets.items);
	 	Assets.font.drawText(batcher, "Score: " + puntuacion, 170, 460);
	 	batcher.endBatch();
	 	int numvidas = 0;
	 	
	 	for (int i = 0; i < vidas; i++) {
	 		batcher.beginBatch(Assets.meteoritos);
	 		batcher.drawSprite(40 + numvidas, 460, 40, 40, Assets.corazon);
	 		batcher.endBatch();
	 		numvidas += 40;
	 	}
	    
	    gl.glDisable(GL10.GL_BLEND);
		
	}
	
	/**
	 * Este metodo indica que hacer en caso de que el jugador pause el juego
	 */
	@Override
	public void pause() {
		// TODO Auto-generated method stub
		
	}
	/**
	 * Este metodo indica que hacer en caso de que se reanude el juego despues de una pausa
	 */
	@Override
	public void resume() {
		// TODO Auto-generated method stub
	}
	
	@Override
	public void dispose() {
		// TODO Auto-generated method stub
		
	}
}
